// Content Script - 在拼多多页面中运行，可以访问页面的 cookies 和全局变量

console.log('🏪 拼多多 Mall ID 获取工具已加载（仅响应点击获取）');

// ========== 频率控制相关变量 ==========
let isFetching = false; // 是否正在获取中（防止并发）
let lastFetchTime = 0; // 上次获取时间戳
const FETCH_COOLDOWN = 3000; // 冷却时间：3秒
let retryCount = 0; // 重试计数
const MAX_RETRIES = 3; // 最大重试次数

// 缓存相关
let cachedMallData = null; // 缓存的 Mall 数据
let cacheExpireTime = 0; // 缓存过期时间
const CACHE_DURATION = 60000; // 缓存时长：1分钟

// ========== 监听来自 popup 的消息 ==========
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === 'getMallId') {
    console.log('📞 收到获取 Mall ID 请求');

    // 获取 Mall ID（带频率控制，不强制刷新）
    // 这样可以利用缓存和冷却机制，防止疯狂点击
    getMallIdFromPageWithRateLimit(false) // forceRefresh = false
      .then(result => {
        console.log('✅ 获取成功:', result);
        sendResponse(result);
      })
      .catch(error => {
        console.error('❌ 获取失败:', error);
        sendResponse({
          success: false,
          error: error.message
        });
      });

    // 返回 true 表示异步响应
    return true;
  }
});

// ========== 带频率控制的获取函数（主入口）==========
async function getMallIdFromPageWithRateLimit(forceRefresh = false) {
  console.log('🔍 [频率控制] 开始获取 Mall ID...');

  // 1. 检查是否正在获取中（防止并发）
  if (isFetching) {
    console.log('⏸️ [频率控制] 已有请求正在进行中，跳过本次请求');
    throw new Error('请求正在进行中，请稍后再试');
  }

  // 2. 检查冷却时间（除非强制刷新）
  if (!forceRefresh) {
    const now = Date.now();
    const timeSinceLastFetch = now - lastFetchTime;

    if (timeSinceLastFetch < FETCH_COOLDOWN) {
      const waitTime = FETCH_COOLDOWN - timeSinceLastFetch;
      console.log(`⏸️ [频率控制] 冷却中，还需等待 ${waitTime}ms`);
      throw new Error(`请求过于频繁，请等待 ${Math.ceil(waitTime / 1000)} 秒后再试`);
    }
  }

  // 3. 检查缓存（除非强制刷新）
  if (!forceRefresh && cachedMallData && Date.now() < cacheExpireTime) {
    console.log('📦 [频率控制] 使用缓存的 Mall ID:', cachedMallData);
    return cachedMallData;
  }

  // 4. 检查重试次数
  if (retryCount >= MAX_RETRIES) {
    console.error('❌ [频率控制] 已达到最大重试次数');
    retryCount = 0; // 重置计数器
    throw new Error('获取失败次数过多，请稍后再试');
  }

  // 5. 开始实际获取
  isFetching = true;
  lastFetchTime = Date.now();

  try {
    console.log(`🚀 [频率控制] 开始实际获取（第 ${retryCount + 1} 次尝试）...`);
    const result = await getMallIdFromPage();

    // 获取成功，更新缓存
    cachedMallData = result;
    cacheExpireTime = Date.now() + CACHE_DURATION;
    retryCount = 0; // 重置重试计数

    console.log('✅ [频率控制] 获取成功，已缓存数据');
    return result;

  } catch (error) {
    retryCount++;
    console.error(`❌ [频率控制] 获取失败（第 ${retryCount} 次）:`, error.message);

    // 如果是登录页面错误，清除缓存
    if (error.message.includes('请先登录')) {
      console.log('🗑️ 清除缓存（登录页面）');
      cachedMallData = null;
      cacheExpireTime = 0;
    }

    throw error;

  } finally {
    isFetching = false;
  }
}

// ========== 从页面中获取 Mall ID（原始函数，不带频率控制）==========
async function getMallIdFromPage() {
  console.log('🔍 开始从页面提取 Mall ID...');
  console.log('📍 当前页面:', window.location.href);

  // ========== 检查是否在登录页面 ==========
  const currentUrl = window.location.href;
  if (currentUrl.includes('/login') || currentUrl.includes('/login/')) {
    console.log('❌ 当前在登录页面，无法获取店铺信息');
    throw new Error('请先登录拼多多商家后台');
  }

  let mallId = null;
  let mallName = null;

  // 🔍 调试：输出所有可能的全局变量
  console.log('🔍 调试信息：');
  console.log('  - window.rawData:', window.rawData);
  console.log('  - window._CONFIG:', window._CONFIG);
  console.log('  - window.g_config:', window.g_config);
  console.log('  - window.__INITIAL_STATE__:', window.__INITIAL_STATE__);

  // 方法1: 从全局变量 window.rawData 获取
  try {
    if (window.rawData && window.rawData.store) {
      mallId = window.rawData.store.mallId;
      mallName = window.rawData.store.mallName || window.rawData.store.storeName;
      console.log('✅ 方法1成功: 从 window.rawData 获取');
      console.log('  - Mall ID:', mallId);
      console.log('  - 店铺名称:', mallName);
      console.log('  - 完整数据:', window.rawData.store);
    }
  } catch (e) {
    console.log('⚠️ 方法1失败:', e.message);
  }

  // 方法2: 从 window._CONFIG 获取
  if (!mallId || !mallName) {
    try {
      if (window._CONFIG) {
        if (!mallId && window._CONFIG.mallId) {
          mallId = window._CONFIG.mallId;
          console.log('✅ 方法2成功: 从 window._CONFIG 获取 Mall ID');
          console.log('  - Mall ID:', mallId);
        }
        if (!mallName && (window._CONFIG.mallName || window._CONFIG.storeName)) {
          mallName = window._CONFIG.mallName || window._CONFIG.storeName;
          console.log('✅ 方法2成功: 从 window._CONFIG 获取店铺名称');
          console.log('  - 店铺名称:', mallName);
        }
        console.log('  - 完整数据:', window._CONFIG);
      }
    } catch (e) {
      console.log('⚠️ 方法2失败:', e.message);
    }
  }

  // 方法3: 从 window.g_config 获取
  if (!mallId || !mallName) {
    try {
      if (window.g_config) {
        if (!mallId && window.g_config.mall_id) {
          mallId = window.g_config.mall_id;
          console.log('✅ 方法3成功: 从 window.g_config 获取 Mall ID');
          console.log('  - Mall ID:', mallId);
        }
        if (!mallName && window.g_config.mall_name) {
          mallName = window.g_config.mall_name;
          console.log('✅ 方法3成功: 从 window.g_config 获取店铺名称');
          console.log('  - 店铺名称:', mallName);
        }
        console.log('  - 完整数据:', window.g_config);
      }
    } catch (e) {
      console.log('⚠️ 方法3失败:', e.message);
    }
  }

  // 方法4: 从 localStorage 获取
  if (!mallId || !mallName) {
    try {
      const storeInfo = localStorage.getItem('storeInfo');
      if (storeInfo) {
        const data = JSON.parse(storeInfo);
        if (!mallId && data.mallId) {
          mallId = data.mallId;
          console.log('✅ 方法4成功: 从 localStorage 获取 Mall ID');
          console.log('  - Mall ID:', mallId);
        }
        if (!mallName && (data.mallName || data.storeName)) {
          mallName = data.mallName || data.storeName;
          console.log('✅ 方法4成功: 从 localStorage 获取店铺名称');
          console.log('  - 店铺名称:', mallName);
        }
        console.log('  - 完整数据:', data);
      }
    } catch (e) {
      console.log('⚠️ 方法4失败:', e.message);
    }
  }

  // 方法5: 从页面 script 标签中查找
  if (!mallId || !mallName) {
    try {
      const scripts = document.querySelectorAll('script');
      for (const script of scripts) {
        const content = script.textContent;
        if (content.includes('mallId') || content.includes('mall_id') || content.includes('mallName')) {
          // 尝试匹配 mallId
          if (!mallId) {
            const mallIdMatch = content.match(/["']?mall[_-]?[iI]d["']?\s*[:=]\s*["']?(\d+)["']?/);
            if (mallIdMatch) {
              mallId = mallIdMatch[1];
              console.log('✅ 方法5成功: 从 script 标签获取 Mall ID');
              console.log('  - Mall ID:', mallId);
            }
          }

          // 尝试匹配店铺名称（多种模式）
          if (!mallName) {
            const patterns = [
              /["']?mall[_-]?[nN]ame["']?\s*[:=]\s*["']([^"']+)["']/,
              /["']?store[_-]?[nN]ame["']?\s*[:=]\s*["']([^"']+)["']/,
              /["']?shop[_-]?[nN]ame["']?\s*[:=]\s*["']([^"']+)["']/
            ];

            for (const pattern of patterns) {
              const match = content.match(pattern);
              if (match) {
                mallName = match[1];
                console.log('✅ 方法5成功: 从 script 标签获取店铺名称');
                console.log('  - 店铺名称:', mallName);
                break;
              }
            }
          }

          if (mallId && mallName) break;
        }
      }
    } catch (e) {
      console.log('⚠️ 方法5失败:', e.message);
    }
  }

  // 方法6: 从 URL 参数获取
  if (!mallId) {
    try {
      const urlParams = new URLSearchParams(window.location.search);
      mallId = urlParams.get('mallId') || urlParams.get('mall_id');
      if (mallId) {
        console.log('✅ 方法6成功: 从 URL 参数获取');
        console.log('  - Mall ID:', mallId);
      }
    } catch (e) {
      console.log('⚠️ 方法6失败:', e.message);
    }
  }

  // 方法7: 从 Cookie 获取
  if (!mallId) {
    try {
      const cookies = document.cookie.split(';');
      for (const cookie of cookies) {
        const [name, value] = cookie.trim().split('=');
        if (name === 'mallId' || name === 'mall_id') {
          mallId = value;
          console.log('✅ 方法7成功: 从 Cookie 获取');
          console.log('  - Mall ID:', mallId);
          break;
        }
      }
    } catch (e) {
      console.log('⚠️ 方法7失败:', e.message);
    }
  }

  // 方法8: 从页面 DOM 元素中查找店铺名称
  if (!mallName) {
    try {
      // 尝试从常见的 DOM 元素中查找店铺名称
      const selectors = [
        '.shop-name',
        '.store-name',
        '.mall-name',
        '[class*="shop"][class*="name"]',
        '[class*="store"][class*="name"]',
        '[class*="mall"][class*="name"]'
      ];

      for (const selector of selectors) {
        const element = document.querySelector(selector);
        if (element && element.textContent.trim()) {
          mallName = element.textContent.trim();
          console.log('✅ 方法8成功: 从 DOM 元素获取店铺名称');
          console.log('  - 店铺名称:', mallName);
          console.log('  - 选择器:', selector);
          break;
        }
      }
    } catch (e) {
      console.log('⚠️ 方法8失败:', e.message);
    }
  }

  // 最终检查和输出
  console.log('📊 最终结果:');
  console.log('  - Mall ID:', mallId);
  console.log('  - 店铺名称:', mallName);

  // 严格检查 Mall ID 是否有效
  // 排除 null, undefined, '', '0', 0 等无效值
  if (mallId && mallId !== '0' && mallId !== 0 && String(mallId).trim() !== '') {
    return {
      success: true,
      mall_id: String(mallId),
      mall_name: mallName || '未知店铺'
    };
  } else {
    console.error('❌ Mall ID 无效:', mallId);
    throw new Error('无法获取 Mall ID，请确保已登录拼多多商家后台');
  }
}

